package com.lrkj.common.utils.uuid;

import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Calendar;

/**
 * ID生成器工具类
 *
 * @author lrkj
 */
public class IdUtils {

    private static SecureRandom random = new SecureRandom();

    /**
     * 获取随机UUID
     *
     * @return 随机UUID
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String simpleUUID() {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 随机UUID
     */
    public static String fastUUID() {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID，去掉了横线，使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 简化的UUID，去掉了横线
     */
    public static String fastSimpleUUID() {
        return UUID.fastUUID().toString(true);
    }


    //生成id
    public static long generateId(){
        long id = SnowflakeIdWorker.generateId();//得到id 很长且高位很长部分是一样的数
        StringBuilder sb=new StringBuilder(id+"");
        StringBuilder reverse = sb.reverse();//将id翻转：我们发现id很长，且高位很长部分是一样的数
        id=new Long(reverse.toString())/1000;//切去部分长度
        while(id>1999999999999L){//1999999999以内的10位或9位或8位id;....
            id/=12;
        }
        return numberAfterFillZero(id + "", 12);
    }

    /**
     * 在字符串后面追加 0，示例：str 为 1, length 为 4, 则为 "1000"
     *
     * @param str 被处理的字符串
     * @param length 处理之后的位数
     * @return
     */
    public static long numberAfterFillZero(String str, int length) {
        StringBuffer buffer = new StringBuffer(str);
        if (buffer.length() == length) {
            return Long.valueOf(buffer.toString()) ;
        }else if (buffer.length() > length) {
            return Long.valueOf(buffer.toString().substring(0,12)) ;
        } else {
            while (buffer.length() < length) {
                buffer.append("0");
            }
        }
        return Long.valueOf(buffer.toString()) ;
    }


//    public static void main(String[] args){
//        Runnable r1 = new Runnable() {
//            @Override
//            public void run() {
//                for(int i=0;i<10000;i++){
//                    long l = generateId();
//                    System.out.println(String.format("线程1,第%d次获取主键结果为:%d,长度%d",i+1,l,(l+"").length()));
//                }
//            }
//        };
//
//        Runnable r2 = new Runnable() {
//            @Override
//            public void run() {
//                for(int i=0;i<30000;i++){
//                    long l = generateId();
//                    System.out.println(String.format("线程2,第%d次获取主键结果为:%d,长度%d",i+1,l,(l+"").length()));
//                }
//            }
//        };
//
//        Thread t1 = new Thread(r1);
//        Thread t2 = new Thread(r2);
//        t1.start();
//        t2.start();
//    }


}
